<?php

/**
 * Description of Parceiro
 *  
 * nome, contacto, nome da pessoa de contacto, 
 * número de identificação fiscal (NIF), 
 * área de atividade e morada.
 * 
 * @author lmcosta
 */
class Parceiro {

    var $id;
    var $nome;
    var $contacto;
    var $responsavel;
    var $nif;
    var $area;
    var $morada;

    function __construct($id, $nome, $contacto, $responsavel, $nif, $area, $morada) {
        $this->id = $id;
        $this->nome = $nome;
        $this->contacto = $contacto;
        $this->responsavel = $responsavel;
        $this->nif = $nif;
        $this->area = $area;
        $this->morada = $morada;
    }

    public function __toString() {
        return $this->getNome();
    }

}

/**
 * Description of ParceiroDB
 *
 * @author lmcosta
 */
class ParceiroDB {

    var $db_table;
    var $msg_erro;

    function __construct() {
        //Dados por defeito
        $this->db_table = "parceiros";
        $this->msg_erro = "";
    }

    /**
     * Obter todos os parceiros da base de dados
     * @return boolean|\Parceiro 
     */
    public function getAllParceiros() {
        $site = Site::getInstance();
        if (!$site->ligarDB($this->msg_erro)) {
            return false;
        }

        $sql = "SELECT * FROM `$this->db_table` ";
        $result = mysql_query($sql, $site->ligacao_db);

        $parceiros = array();
        while ($parceiro = mysql_fetch_object($result)) {
            $parceiros[] = new Parceiro($parceiro->id, $parceiro->nome, $parceiro->contacto,
                            $parceiro->responsavel, $parceiro->nif, $parceiro->area, $parceiro->morada);
        }
        mysql_free_result($result);
        $site->closeDB();

        return $parceiros;
    }

    /**
     * Adicionar um parceiro na base de dados
     * @param Parceiro $parceiro
     * @return boolean 
     */
    public function adicionarParceiro(Parceiro $parceiro) {
        $site = Site::getInstance();
        if (!$site->ligarDB($this->msg_erro)) {
            return false;
        }

        //Manter segurança nos valores a inserir na BD para não causar sql injection
        $parceiro->nome = FormHelper::tranformarToQuery($parceiro->nome);
        $parceiro->contacto = FormHelper::tranformarToQuery($parceiro->contacto);
        $parceiro->responsavel = FormHelper::tranformarToQuery($parceiro->responsavel);
        $parceiro->nif = FormHelper::tranformarToQuery($parceiro->nif);
        $parceiro->area = FormHelper::tranformarToQuery($parceiro->area);
        $parceiro->morada = FormHelper::tranformarToQuery($parceiro->morada);
        
        $sql = "INSERT INTO `$this->db_table` (`nome`, `contacto`, `responsavel`, `nif`, `area`, `morada`) ";
        $sql .= "VALUES (
                    '{$parceiro->nome}',
                    '{$parceiro->contacto}', 
                    '{$parceiro->responsavel}',
                    '{$parceiro->nif}',
                    '{$parceiro->area}',
                    '{$parceiro->morada}');";

        if (!mysql_query($sql, $site->ligacao_db)) {
            $this->msg_erro = "Erro ao inserir parceiro na base de dados!";
            return false;
        }

        return true;
    }

}

/**
 * Objecto para o formulário de adicionar parceiro 
 */
class ParceiroForm {

    var $id;
    var $nome;
    var $contacto;
    var $responsavel;
    var $nif;
    var $area;
    var $morada;
    var $csrf_token;
    var $msg_erro;

    /**
     * Inicializa os campos com os valores submetidos no formulário, 
     * retira os espaços iniciais e finais e efectua o encode para evitar ataques XSS 
     */
    function __construct() {
        $this->id = trim(FormHelper::encodeInput('id'));
        $this->nome = trim(FormHelper::encodeInput('nome'));
        $this->contacto = trim(FormHelper::encodeInput('contacto'));
        $this->responsavel = trim(FormHelper::encodeInput('responsavel'));
        $this->nif = trim(FormHelper::encodeInput('nif'));
        $this->area = trim(FormHelper::encodeInput('area'));
        $this->morada = trim(FormHelper::encodeInput('morada'));
        $this->csrf_token = trim(FormHelper::encodeInput('csrf_token'));
    }

    public function validaParceiro() {

        //Validar se a csrf_token é igual à que foi gerada quando foi apresentado o formulário
        if ($this->csrf_token != $_SESSION['csrf_token']) {
            $this->defineErro("Iniciar de novo o formulário!");
            return false;
        }

        //Validar campos do formulário
        if (empty($this->nome)) {
            $this->defineErro("Nome vazio!");
            return false;
        }
        if (empty($this->contacto)) {
            $this->defineErro("Contacto vazio!");
            return false;
        }
        if (empty($this->responsavel)) {
            $this->defineErro("Responsável vazio!");
            return false;
        }
        if (empty($this->nif)) {
            $this->defineErro("NIF vazio!");
            return false;
        }
        if (empty($this->area)) {
            $this->defineErro("Área vazio!");
            return false;
        }

        if (empty($this->morada)) {
            $this->defineErro("Morada vazia!");
            return false;
        }

        if (!FormHelper::validateMaxTamanho($this->nome, 255)) {
            $this->defineErro("O nome está limitado a " . 255 . " caracteres!");
            return false;
        }
        if (!FormHelper::validateTamanho($this->contacto, 9, 9)) {
            $this->defineErro("O contacto deve conter " . 9 . " digitos!");
            return false;
        }
        if (!FormHelper::validateMaxTamanho($this->responsavel, 255)) {
            $this->defineErro("O responsável está limitado a " . 255 . " caracteres!");
            return false;
        }
        if (!FormHelper::validateTamanho($this->nif, 9, 9)) {
            $this->defineErro("O NIF deve conter " . 9 . " digitos!");
            return false;
        }
        if (!FormHelper::validateMaxTamanho($this->area, 255)) {
            $this->defineErro("A área está limitada a " . 255 . " caracteres!");
            return false;
        }
        if (!FormHelper::validateMaxTamanho($this->morada, 255)) {
            $this->defineErro("A morada está limitada a " . 255 . " caracteres!");
            return false;
        }

        if (!FormHelper::numerico($this->contacto)) {
            $this->defineErro("O contacto deve ser constituido só por digitos!");
            return false;
        }
        if (!FormHelper::numerico($this->nif)) {
            $this->defineErro("O NIF deve ser constituido só por digitos!");
            return false;
        }
        
        //Criar o parceiro a guardar na base de dados
        $parceiro = new Parceiro($this->id, $this->nome, $this->contacto,
                        $this->responsavel, $this->nif, $this->area, $this->morada);

        $parceiroDB = new ParceiroDB();
        $result = $parceiroDB->adicionarParceiro($parceiro);
        $this->msg_erro = $parceiroDB->msg_erro;

        return $result;
    }

    function defineErro($erro) {
        $this->msg_erro .= $erro . "\r\n";
    }

}

?>
